/**
 * ComponenteDistribuidorContenedor.java
 *
 * Copyright 2011 Universidad Francisco de Paula Santander (UFPS).
 * Todos los Derechos Reservados.
 * Creado el 15/03/2011, 06:00:05 PM
 */
package com.ufps.cuatro.modelo.representacion.componente;

import com.ufps.cuatro.modelo.biblioteca.TipoBiblioteca;
import com.ufps.cuatro.util.Utileria;
import com.ufps.cuatro.util.base.ComponenteBaseStandar;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * <i><b>ComponenteDistribuidorContenedor:</b></i>Esta clase abstracta es la base para
 * representar los Contenedores de Alto Nivel de la Interfaz Gráfica.
 * Un Contenedor de Alto es aquel objeto que encapsula todos los elementos incluidos
 * en la interfaz actual como Componentes etc. Los subtipos de esta Clase son los utilizados 
 * para la Fase de Asistentes.
 * 
 * @author Carlos A. Torres C. - Dolly E. Guerrero. <https://code.google.com/p/tesis4dor/>
 * @version 1.0 15/03/2011
 * @see ComponenteDistribuidor 
 */
public abstract class ComponenteDistribuidorContenedor extends ComponenteDistribuidor {
    private static final long serialVersionUID = -4738240288272435149L;
    
    public final static int PLANTILLA_MOSAICO = 0;
    public final static int PLANTILLA_TAB = 1;

    private int idClaseComponenteContenedor;
    /**
     * Serie Númerica para la generación de id de Objetos.
     */
    public static int serialIdComponenteContenedor;  
    /**
     * Contiene los Componentes Incluidos en la Interfaz.
     */
    protected ArrayList<ComponenteDistribuidor> objComponentes;       
    /**
     * Indica si es el Formulario Principal.
     */
    protected boolean main = false;
    /**
     * Determina la Plantilla que se utilizará para generar el Código Fuente.
     */
    public int plantilla_generacion_codigo_fuente = PLANTILLA_MOSAICO;

    /**
     * Constructor utilizado en la Implementación. Inicializa el Control swing asignado por defecto
     * y propiedades de herencia y previsualización.
     * @param objContenedorBase Objeto Base que permite generar el Componente Gráfico.     
     * @param heredado Indica si el Componente es heredado (solo con los subtipos)
     * @param previsualizar Indica si el Componente se creará o solo es una previsualización.
     */
    public ComponenteDistribuidorContenedor(ComponenteBaseStandar objContenedorBase, boolean heredado, boolean previsualizar) {
        super(objContenedorBase, true, true); 
//       if(objContenedorBase != null){
        this.heredado = heredado;
        this.previsualizar = previsualizar;        
        this.dni = Utileria.leerRecursoTexto("Utileria.dni.componente.distribuidor.contenedor");   
        if(!heredado){
            this.idClaseComponenteContenedor = (!previsualizar) ? 
                    ComponenteDistribuidorContenedor.serialIdComponenteContenedor++ : 
                    ComponenteDistribuidorContenedor.serialIdComponenteContenedor;
        }
//    } 
    }
    
    /**
     * Devuelve el Id de Generación del Objeto en la Implementación.
     * Esta propiedad es utilizada solo para procesos internos de la interfaz.
     * @return Id de Generación del Objeto en la Implementación.
     */
    public int getIdClaseComponenteContenedor() {
        return idClaseComponenteContenedor;
    }
    
    public boolean ubicarComponentesEnTablaDistribucion(){        
        try{
            Distribuidor objDistribuidorSeleccionado = this.getObjDistribuidorGrupalSeleccionado();
            return objDistribuidorSeleccionado.generarTablaDistribucion();
        }catch(java.lang.Exception ex){
            Logger.getLogger(ComponenteDistribuidorGeneradorClaseCompleja.class.getName()).log(Level.SEVERE, null, ex);
        }
        return false;
    }
    
    public Componente buscarComponente(String strName){
        try{            
            strName = Utileria.formatStringSinHTML(strName);
            Componente objComponente;            
            //Primero se Busca en la Colección de Componentes Incluidos
            objComponente = this.buscarComponenteEnDistribucion(strName);
            if(objComponente != null){
                return objComponente;
            }
            //Luego busco en los Componentes Generados
            objComponente = this.getObjComponenteIncluido(strName);
            if(objComponente != null){
                return objComponente;
            }
            objComponente = this.buscarComponenteGenerado(strName);
            if(objComponente != null){
                return objComponente;
            }
        }catch(java.lang.NullPointerException ex){            
        }
        return null;
    }
    
    /**
     * Devuelve la Colección de Componentes Agregados al Contenedor.
     * @return Colección de Componente Agregados.
     */
    public ArrayList<ComponenteDistribuidor> getObjComponentes() {
        return objComponentes;
    }

    /**
     * Establece la Colección de Componentes Agregados al Contenedor.
     * @param objComponentes 
     */
    public void setObjComponentes(ArrayList<ComponenteDistribuidor> objComponentes) {
        this.objComponentes = objComponentes;
    }

    /**
     * Devuelve el Estado que determina si el objeto es el formulario principal.
     * @return Estado que determina si el objeto es el formulario principal.
     */
    public boolean isMain() {
        return main;
    }

    /**
     * Establece el Estado que determina si el objeto es el formulario principal.
     * @param main Estado que determina si el objeto es el formulario principal.
     */
    public void setMain(boolean main) {
        this.main = main;
    }
    
    
    
    @Override    
    public String toString() {
        if(this.eBiblioteca == TipoBiblioteca.eSwap) {
            return this.objClassSwing.getSimpleName() + "BS" + dni + this.idClaseComponenteContenedor;
        }
        else if(this.eBiblioteca == TipoBiblioteca.eLocal) {
            return this.objClassSwing.getSimpleName() + "BL" + dni + this.idClaseComponenteContenedor;
        }
        else if(this.eBiblioteca == TipoBiblioteca.eGlobal) {
            return this.objClassSwing.getSimpleName() + "BG" + dni + this.idClaseComponenteContenedor;
        }
        return this.objClassSwing.getSimpleName() + this.dni + this.idClaseComponenteContenedor;
    }
    
    @Override
    public int compareTo(Object o) {
        ComponenteDistribuidorContenedor obj = (ComponenteDistribuidorContenedor) o;
        if(this.idClaseComponenteContenedor > obj.idClaseComponenteContenedor) {
            return 1;
        }
        else if(this.idClaseComponenteContenedor < obj.idClaseComponenteContenedor) {
            return -1;
        }
        else {
            return 0;
        }
    }   

    @Override
    public void ok() {
        if(this.previsualizar){
            this.idClaseComponenteContenedor = ComponenteDistribuidorContenedor.serialIdComponenteContenedor++;
            this.previsualizar = false;
        }
    } 
}
